' CallOllama.bas
#COMPILE EXE
#DIM ALL
'
#INCLUDE "Win32api.inc"
'
FUNCTION PBMAIN () AS LONG
 ' start processing
  CON.STDOUT "Processing"
  ' call the curl app
  'funCallCurl()
  '
  ' call Command line Ollama
  'funCallOllama()
  '
  ' call Command line with input
  LOCAL strInputFile AS STRING
  strInputFile = EXE.PATH$ & "Document.txt"
  '
  IF ISTRUE funCallOllama_withInput(strInputFile) THEN
    CON.STDOUT "File processed"
  ELSE
    CON.STDOUT "Input file does not exist"
  END IF
  '
  ' finished
  CON.STDOUT "Finishing processing"
  SLEEP 3000

END FUNCTION
'
FUNCTION funCallOllama_withInput(strInputFile AS STRING) AS LONG
' call Ollama on the command line an give it an input
  LOCAL strCMD AS STRING         ' holds command line string
  LOCAL strOllamaBatch AS STRING ' batch file to run
  LOCAL strModel AS STRING       ' name of model to be used
  LOCAL strPrompt AS STRING      ' prompt to be used
  LOCAL strResponse AS STRING    ' file for output
  '
  IF ISFALSE ISFILE(strInputFile) THEN
  ' ensure input file exists
    EXIT FUNCTION
  END IF
  '
  strModel = "gpt-oss:120b"
  strPrompt = "Please summarise this document"
  strResponse = EXE.PATH$ & "DocumentSummary.txt"
  strOllamaBatch = EXE.PATH$ & "Ollama_Batch.bat
  '
  strCMD = "ollama run " & strModel & " " & _
           $DQ & strPrompt & $DQ & _
           " < " & $DQ & strInputFile & $DQ & _
           " >>" & $DQ & strResponse & $DQ
           '
  TRY
    KILL strOllamaBatch
  CATCH
  FINALLY
  END TRY
  '
  TRY
    KILL strResponse
  CATCH
  FINALLY
  END TRY
  '
  funAppendToFile(strOllamaBatch,strCMD)
  funExecCmd(strOllamaBatch & "")
  '
END FUNCTION
'
FUNCTION funCallOllama() AS LONG
' call Ollama on the command line
  LOCAL strCMD AS STRING         ' holds command line string
  LOCAL strOllamaBatch AS STRING ' batch file to run
  LOCAL strModel AS STRING       ' name of model to be used
  LOCAL strPrompt AS STRING      ' prompt to be used
  LOCAL strResponse AS STRING    ' file for output
  '
  strModel = "gpt-oss:120b"
  strPrompt = "Tell me a joke about cats"
  strResponse = EXE.PATH$ & "Ollama_Response.txt"
  strOllamaBatch = EXE.PATH$ & "Ollama_Batch.bat
  '
  strCMD = "ollama run " & strModel & " " & _
           $DQ & strPrompt & $DQ & _
           " >>" & $DQ & strResponse & $DQ
           '
  TRY
    KILL strOllamaBatch
  CATCH
  FINALLY
  END TRY
  '
  TRY
    KILL strResponse
  CATCH
  FINALLY
  END TRY
  '
  funAppendToFile(strOllamaBatch,strCMD)
  funExecCmd(strOllamaBatch & "")
  '
END FUNCTION
'
FUNCTION funCallCurl() AS LONG
' call Ollama via CURL
'
  LOCAL strCMD AS STRING      ' holds command line string
  LOCAL strModel AS STRING    ' name of model to be used
  LOCAL strPrompt AS STRING   ' prompt to be used
  LOCAL strStream AS STRING   ' true or false to stream output
  LOCAL strURL AS STRING      ' url for Ollama
  LOCAL strOutput AS STRING   ' path/name of output file
  '
  strURL    = "http://localhost:11434/api/generate"
  strModel  = "gpt-oss:120b"
  strPrompt = "Tell me a joke about cats"
  strStream = "true"
  strOutput = "output.txt"
  '
  strCMD = "curl " & $DQ & strURL & $DQ & _
           " --header " & $DQ & "Content-Type: application/json" & $DQ & _
           " -d " & $DQ & _
           "{\" & $DQ & "model\" & $DQ & ":\" & _
           $DQ & strModel & "\" & $DQ & "," & _
           "\" & $DQ & "prompt\" & $DQ & ":\" & _
           $DQ & strPrompt & "\" & $DQ & "}" & $DQ & _
           " \ --output " & $DQ & strOutput & $DQ
  funAppendToFile("command.txt",strCMD)
  '
  funExecCmd(strCMD & "")
  '
END FUNCTION
'
FUNCTION funExecCmd(cmdLine1 AS ASCIIZ, OPTIONAL BYVAL lngConsole AS LONG) AS LONG
  DIM rcProcess AS Process_Information
  DIM rcStart AS startupInfo
  DIM Retc AS LONG
  '
  DIM lngWindow AS LONG
  '
  IF lngConsole = 0 OR lngConsole = %CREATE_NO_WINDOW THEN
    lngWindow = %CREATE_NO_WINDOW
  ELSE
    lngWindow = %CREATE_NEW_CONSOLE
  END IF
  '
  rcStart.cb = LEN(rcStart)
  '
  RetC = CreateProcess(BYVAL %NULL, CmdLine1, BYVAL %NULL, BYVAL %NULL, 1&, lngWindow OR _
                       %NORMAL_PRIORITY_CLASS, _
                       BYVAL %NULL, BYVAL %NULL, rcStart, rcProcess)
  RetC = %WAIT_TIMEOUT
  DO WHILE RetC = %WAIT_TIMEOUT
    RetC = WaitForSingleObject(rcProcess.hProcess,-1)
    SLEEP 50
  LOOP
  CALL GetExitCodeProcess(rcProcess.hProcess, RetC)
  CALL CloseHandle(rcProcess.hThread)
  CALL CloseHandle(rcProcess.hProcess)
  '
END FUNCTION
'
FUNCTION funAppendToFile(strFilePathToAddTo AS STRING, _
                         strData AS STRING) AS LONG
' append strData to the file if it exists or create a new one if it doesn't
  DIM intFile AS INTEGER
  DIM strError AS STRING
  '
  intFile = FREEFILE
  TRY
   IF ISTRUE ISFILE(strFilePathToAddTo) THEN
      OPEN strFilePathToAddTo FOR APPEND LOCK SHARED AS #intFile
    ELSE
      OPEN strFilePathToAddTo FOR OUTPUT AS #intFile
    END IF
    '
    PRINT #intFile, strData
    '
    FUNCTION = %TRUE
  CATCH
    strError = ERROR$   ' trap error for debug purposes
    FUNCTION = %FALSE
  FINALLY
    CLOSE #intfile
  END TRY
  '
END FUNCTION